关于 Kubernetes中etcd的一些笔记
一个人思虑太多,就会失去做人的乐趣。——莎士比亚
写在前面
- 学
k8s涉及到一些etcd的知识,所以学习后这里系统整理下。 - 博文内容涉及:
- 单节点
etcd搭建,版本切换 etcd集群搭建:用两个节点初始化,然后动态添加一个节点到集群。etcd集群数据快照恢复- 为了方便,使用
ansible,所以阅读本文需要知道一点ansible
- 单节点
一个人思虑太多,就会失去做人的乐趣。——莎士比亚
一、etcd概述
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。类似于微服务项目中服务注册与发现组件: Eureka、 Zookeeper 和 Consul 等。
| etcd具有以下特点: |
|---|
完全复制:集群中的每个节点都可以使用完整的存档 |
高可用性:Etcd可用于避免硬件的单点故障或网络问题 |
一致性:每次读取都会返回跨多主机的最新写入 |
简单:包括一个定义良好、面向用户的API(gRPC) |
安全:实现了带有可选的客户端证书身份验证的自动化TLS |
快速:每秒10000次写入的基准速度 |
| 可靠:使用Raft算法实现了强一致、高可用的服务存储目录 |
二、单节点ETCD搭建
机器:192.168.26.91
安装etcd包
1 | ┌──[root@liruilongs.github.io]-[~] |
修改配置文件
1 | ┌──[root@liruilongs.github.io]-[~] |
设置开机自启
1 | ┌──[root@liruilongs.github.io]-[~] |
isLeader=true 是否为leader
基本命令测试
1 | ┌──[root@liruilongs.github.io]-[~] |
2和3版本切换
1 | ┌──[root@liruilongs.github.io]-[~] |
三、etcd集群构建
ETCD集群是一个分布式系统,使用Raft协议来维护集群内各个节点状态的一致性。- 主机状态
Leader,Follower,Candidate - 当集群初始化时候,每个节点都是
Follower角色,通过心跳与其他节点同步数据 - 通过
Follower读取数据,通过Leader写入数据 - 当
Follower在一定时间内没有收到来自主节点的心跳,会将自己角色改变为Candidate,并发起一次选主投票 - 配置etcd集群,建议尽可能是
奇数个节点,而不要偶数个节点,推荐的数量为 3、5 或者 7 个节点构成一个集群。
1、创建集群
这里使用ansible的方式实现
vms81.liruilongs.github.io 控制节点
192.168.26.100 etcd节点 受控节点
192.168.26.102 etcd节点 受控节点
192.168.26.101 etcd节点 受控节点
环境准备,主机清单编写
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
受控节点ping测试
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
配置文件修改
这里用前两台(192.168.26.100,192.168.26.101)初始化集群,第三台(192.168.26.102 )以添加的方式加入集群
本机编写配置文件。
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
| 参数的意义 |
|---|
ETCD_NAME 节点名称,默认为defaul |
ETCD_DATA_DIR 服务运行数据保存的路 |
ETCD_LISTEN_PEER_URLS 监听的同伴通信的地址,比如http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost |
ETCD_LISTEN_CLIENT_URLS 监听的客户端服务地 |
ETCD_ADVERTISE_CLIENT_URLS 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点 |
ETCD_INITIAL_ADVERTISE_PEER_URLS 对外公告的该节点同伴监听地址,这个值会告诉集群中其他节 |
ETCD_INITIAL_CLUSTER 集群中所有节点的信息,格式 |
ETCD_INITIAL_CLUSTER_STATE 新建集群的时候,这个值为 new;假如加入已经存在的集群,这个值为existing |
ETCD_INITIAL_CLUSTER_TOKEN 集群的ID,多个集群的时候,每个集群的ID必须保持唯一 |
把配置文件拷贝到192.168.26.100,192.168.26.101
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
检查配置文件
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
修改101的配置文件
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
查看etcd集群
192.168.26.101 为 Leader
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
添加etcd 192.168.26.102到集群
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
修改之前写好的配置文件给102
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
配置文件拷贝替换,启动etcd
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
检查集群是否添加成功
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
设置环境变量,切换版本,这里有一点麻烦。
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
同步性测试
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
四、etcd集群备份,恢复
准备数据
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
在任何一台主机上对 etcd 做快照
1 | #在任何一台主机上对 etcd 做快照 |
清空数据
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
在所有节点上关闭 etcd,并删除/var/lib/etcd/里所有数据:
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
在所有节点上把快照文件的所有者和所属组设置为 etcd:
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
在每台节点上开始恢复数据:
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
所有节点把/var/lib/etcd 及里面内容的所有者和所属组改为 etcd:v然后分别启动 etcd
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
把剩下的节点添加进集群
1 | # etcdctl member add etcd_name –peer-urls=”https://peerURLs” |
测试恢复结果
1 | ┌──[root@vms81.liruilongs.github.io]-[~/ansible] |
k8s中etcd以pod的方式设置
1 | ┌──[root@vms81.liruilongs.github.io]-[~] |
关于 Kubernetes中etcd的一些笔记
https://liruilongs.github.io/2021/11/19/K8s/etcd/关于 Kubernetes中etcd的一些笔记/

